package com.smart.milvus.conditions;

import io.milvus.common.clientenum.ConsistencyLevelEnum;
import org.apache.commons.collections4.CollectionUtils;
import com.smart.milvus.base.IExprSegment;
import com.smart.milvus.bean.MilvusModel;
import com.smart.milvus.conditions.segments.MergeSegments;

import java.util.List;

/**
 * 条件构造抽象类
 */
public interface Wrapper<T extends MilvusModel<? extends MilvusModel<?>>> extends IExprSegment {
    /**
     * 获取 MergeSegments
     *
     * @return 合并片段
     */
    MergeSegments getExpression();

    /**
     * 获取实体
     *
     * @return {@link T }
     */
    T getEntity();

    /**
     * 设置实体
     *
     * @param entity 实体
     */
    void setEntity(T entity);

    /**
     * 获取实体类
     *
     * @return {@link Class }<{@link T }>
     */
    Class<T> getEntityClass();

    /**
     * Set Entity 类
     *
     * @param entityClass Entity 类
     */
    void setEntityClass(Class<T> entityClass);

    /**
     * 获取一致性级别
     *
     * @return {@link ConsistencyLevelEnum }
     */
    ConsistencyLevelEnum getConsistencyLevel();

    /**
     * 获取分区名称
     *
     * @return {@link List }<{@link String }>
     */
    List<String> getPartitionNames();

    /**
     * 查询条件为空
     *
     * @return 是否为空
     */
    default boolean isEmptyOfWhere() {
        return isEmptyOfNormal();
    }

    /**
     * 查询条件不为空(包含entity)
     *
     * @return 是否不为空
     */
    default boolean isNonEmptyOfWhere() {
        return !isEmptyOfWhere();
    }

    /**
     * 查询条件为空(不包含entity)
     *
     * @return 是否为空
     */
    default boolean isEmptyOfNormal() {
        return CollectionUtils.isEmpty(getExpression().getNormal());
    }

    /**
     * 查询条件为空(不包含entity)
     *
     * @return 是否不为空
     */
    default boolean isNonEmptyOfNormal() {
        return !isEmptyOfNormal();
    }

    /**
     * 获取格式化后的执行Expr
     *
     * @return Expr
     * @since 3.3.1
     */
    default String getTargetExpr() {
        return getExprSegment().replaceAll("#\\{.+?}", "?");
    }

    /**
     * 条件清空
     *
     * @since 3.3.1
     */
    void clear();
}
